package com.example.qqviewspringboot.service;

import com.example.qqviewspringboot.data.Message;
import org.springframework.stereotype.Service;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Service
public class MessagePushService {

    private final Map<Long, List<Message>> pendingMessages = new ConcurrentHashMap<>();  // 存储待推送的消息
    private final Map<Long, WebSocketSession> userSessions = new ConcurrentHashMap<>(); // 存储在线用户的WebSocket会话

    /**
     * 保存待推送的消息
     *
     * @param recipientId 接收者的ID
     * @param message     消息对象
     */
    public void savePendingMessage(Long recipientId, Message message) {
        pendingMessages.computeIfAbsent(recipientId, k -> new ArrayList<>()).add(message);
    }

    /**
     * 获取待推送的消息
     *
     * @param recipientId 接收者的ID
     * @return 待推送消息列表
     */
    public List<Message> getPendingMessages(Long recipientId) {
        return pendingMessages.getOrDefault(recipientId, new ArrayList<>());
    }

    /**
     * 清空指定用户的待推送消息
     *
     * @param recipientId 接收者的ID
     */
    public void clearPendingMessages(Long recipientId) {
        pendingMessages.remove(recipientId);
    }

    /**
     * 判断用户是否在线，如果在线则推送消息
     *
     * @param recipientId 接收者ID
     * @param content     消息内容
     * @param mediaType   媒体类型（可选）
     * @param mediaUrl    媒体URL（可选）
     * @return 是否成功推送消息
     */
    public boolean pushMessageIfOnline(Long recipientId, String content, String mediaType, String mediaUrl) {
        WebSocketSession session = userSessions.get(recipientId);  // 获取用户的WebSocket会话

        if (session != null && session.isOpen()) {
            try {
                // 构建包含媒体信息的消息内容
                StringBuilder messageContent = new StringBuilder();
                if (content != null && !content.trim().isEmpty()) {
                    messageContent.append(content);
                }
                if (mediaUrl != null && !mediaUrl.trim().isEmpty()) {
                    messageContent.append(" [Media] ").append(mediaUrl);
                }

                // 发送消息给接收者
                session.sendMessage(new TextMessage(messageContent.toString()));
                return true;  // 推送成功
            } catch (IOException e) {
                System.err.println("Error while sending message to user " + recipientId);
                e.printStackTrace();
            }
        }
        return false;  // 用户不在线或者推送失败
    }

    /**
     * 兼容旧方法，将其转发到新方法，传递 null 作为媒体参数
     *
     * @param recipientId 接收者ID
     * @param content     消息内容
     * @return 是否成功推送消息
     */
    public boolean pushMessageIfOnline(Long recipientId, String content) {
        return pushMessageIfOnline(recipientId, content, null, null);
    }

    /**
     * 向用户注册WebSocket会话
     *
     * @param userId  用户ID
     * @param session 用户的WebSocket会话
     */
    public void registerUserSession(Long userId, WebSocketSession session) {
        userSessions.put(userId, session);
    }

    /**
     * 从WebSocket会话中注销用户
     *
     * @param userId 用户ID
     */
    public void unregisterUserSession(Long userId) {
        userSessions.remove(userId);
    }

    /**
     * 向用户推送所有待发送的消息
     *
     * @param userId 用户ID
     */
    public void pushPendingMessages(Long userId) {
        List<Message> messages = getPendingMessages(userId);
        if (messages != null && !messages.isEmpty()) {
            WebSocketSession session = userSessions.get(userId);
            if (session != null && session.isOpen()) {
                List<Message> messagesToRemove = new ArrayList<>();
                for (Message message : messages) {
                    try {
                        // 构建包含媒体信息的消息内容
                        StringBuilder messageContent = new StringBuilder();
                        if (message.getContent() != null && !message.getContent().trim().isEmpty()) {
                            messageContent.append(message.getContent());
                        }
                        if (message.getMediaUrl() != null && !message.getMediaUrl().trim().isEmpty()) {
                            messageContent.append(" [Media] ").append(message.getMediaUrl());
                        }

                        // 发送消息
                        session.sendMessage(new TextMessage(messageContent.toString()));
                        // 推送后标记为移除
                        messagesToRemove.add(message);
                    } catch (IOException e) {
                        System.err.println("Error while sending pending messages to user " + userId);
                        e.printStackTrace();
                    }
                }
                // 移除已发送的消息
                messages.removeAll(messagesToRemove);
            }
        }
    }
}
